#include <stdio.h>
#include <stdlib.h>
#include "list.h"

list InitList() // 初始化线性表,构造一个空的线性表L
{
    list L;
    L.base = (DATABASE *)malloc(INIT_LIST_SIZE * sizeof(DATABASE));
    if (!L.base)
    {
        printf("存储分配失败！\n");
        exit(-1);
    }
    L.length = 0;
    L.listsize = INIT_LIST_SIZE;
    return L;
}


int ListLength(list L) // 返回线性表的长度
{
    return L.length;
}


DATABASE GetElem(list L, int i) // 返回线性表L中第i个元素的值
{
    if (i < 1 || i > L.length)
    {
        printf("第%d个元素不存在！\n", i);
        exit(-1);
    }
    return *(L.base + i - 1);
}


void printElem(list L) // 打印线性表元素
{
    printf("[");
    for (int i = 0; i < L.length; i++)
    {
        printf("%d", *(L.base + i));
		if(i!=L.length-1){
			putchar(',');
		}
    }
    printf("]");
    printf("\n");
}



int ListEmpty(list L) // 判断线性表L是否为空
{
    return L.length == 0;
}


int ListInsert(list *L, int i, DATABASE e) // 在顺序线性表L的第i个位置之前插入新的数据元素e
{
    if (i < 1 || i > L->length + 1)
    {
        printf("插入位置不合法！\n");
        return -1;
    }
    if (L->length >= L->listsize) // 存储空间已满，需重新分配
    {
        DATABASE * newbase = (DATABASE *)realloc(L->base, (L->listsize + LISTINCREMENT) * sizeof(DATABASE));
        if (!newbase)
        {
            printf("存储分配失败！\n");
            return -1;
        }
        L->base = newbase;
        L->listsize += LISTINCREMENT;
    }
    for (int j = L->length; j >= i; j--) // 插入位置及之后的元素后移
    {
        *(L->base + j) = *(L->base + j - 1);
    }
    *(L->base + i - 1) = e; // 插入新元素
    L->length++; // 表长增1
    return 0;
}
DATABASE ListDelete(list *L, int i){  // 删除顺序线性表L的第i个数据元素，并用e返回其值
	DATABASE e;
	// i合法性校验
	
    if (i < 1 || i > L->length)
    {
        printf("删除位置不合法！\n");
        exit(-1);
    }

	// i-length 范围内的所有元素都向前移一位
	e = *(L->base+i-1);
	for(int j=i;j<L->length;j++){
		*(L->base+j-1)=*(L->base+j);
	}
	L->length--;
	return e;
}

int LocateElem(list L, DATABASE e,int (*func)(DATABASE,DATABASE)){ // 在线性表L中查找与e满足关系func()的数据元素的位序
	// 遍历
	for(int i=0;i<L.length;i++){
		if(func(*(L.base+i),e))
			return i+1;
	}
	return -1;// 没有找到
}
// list.c - 添加销毁函数
void DestroyList(list *L) {
    if (L->base != NULL) {
        free(L->base);
        L->base = NULL;
    }
    L->length = 0;
    L->listsize = 0;
}
// list.c - 添加清空函数
void ClearList(list *L) {
    L->length = 0;
    // 注意：不清空内存，只重置长度
}
// list.c - 添加遍历函数
void ListTraverse(list L, void (*func)(DATABASE)) {
    for (int i = 0; i < L.length; i++) {
        func(*(L.base + i));
    }
}
// list.c - 添加前后元素查找
DATABASE NextElem(list L, DATABASE cur_e) {
    for (int i = 0; i < L.length - 1; i++) {
        if (*(L.base + i) == cur_e) {
            return *(L.base + i + 1);
        }
    }
    printf("元素%d没有后继元素或不存在！\n", cur_e);
	exit(-1);
}

DATABASE PriorElem(list L, DATABASE cur_e) {
    for (int i = 1; i < L.length; i++) {
        if (*(L.base + i) == cur_e) {
            return *(L.base + i - 1);
        }
    }
    printf("元素%d没有前驱元素或不存在！\n", cur_e);
	exit(-1);
}
